Spring @Value—从yml文件中引入list

在SpringBoot中要引入yml配置文件中的数组,用常用的@Value是不可取的,我们必须另寻途径。详见以下代码:

配置文件,其中mqtt是一个对象,urls是一个字符串数组,mappings是一个对象数组

1
2
3
4
5
6
7
8
9
10
11
12
mqtt:
urls:
- tcp://120.24.75.149:1883
clientId: mqtt-gateway
completionTimeout: 5000
router:
mappings:
- topicFilter: msg
service: sensors
- topicFilter: people
service: people

配置代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import cn.webfuse.valuedemo.configuration.properties.Mappings;
import cn.webfuse.valuedemo.configuration.properties.MqttUrls;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DefaultConfiguration {
@Bean
@ConfigurationProperties(prefix = "mqtt")
MqttUrls mqttUrls() {
return new MqttUrls();
}
@Bean
@ConfigurationProperties(prefix = "router")
Mappings mappings() {
return new Mappings();
}
@Value("${mqtt.clientId}")
String clientId;
}

上述代码中用到的对象类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Mapping {
private String topicFilter;
private String service;
public String getTopicFilter() {
return topicFilter;
}
public void setTopicFilter(String topicFilter) {
this.topicFilter = topicFilter;
}
public String getService() {
return service;
}
public void setService(String service) {
this.service = service;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Mappings {
private List<Mapping> mappings = new ArrayList<>();
public List<Mapping> getMappings() {
return mappings;
}
public void setMappings(List<Mapping> mappings) {
this.mappings = mappings;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
public class MqttUrls {
private List<String> urls = new ArrayList<>();
public List<String> getUrls() {
return this.urls;
}
public void setUrls(List<String> urls) {
this.urls = urls;
}
}

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RequestMapping("/")
@RestController
public class DefaultController {
@Autowired
MqttUrls mqttUrls;
@Autowired
Mappings mappings;
@GetMapping(value = "/urls/show")
public List<String> show() {
return mqttUrls.getUrls();
}
@GetMapping("/mappings/show")
public List<Mapping> showMappings() {
return mappings.getMappings();
}
}